/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package es.uned.modelo;

import es.uned.controlador.PacmanUtils;
import java.awt.Image; 
import javax.swing.ImageIcon; 

/**
 *
 * @author gabriel
 */
public class Fantasma extends Personaje{

    private String nombre = "Fantasma"; //Blinky, Pinky, Inky o Clyde
    private boolean miedo, colision = false; 
    private final String vulnerableGhostPath = PacmanUtils.VULNERABLE_GHOST_PATH;
    private Image vulnerableGhostImage; 
    private boolean colisionIzquierda=false;
    private boolean colisionDerecha=false;
    private boolean colisionArriba=false;
    private boolean colisionAbajo=false;

    public Fantasma() {
        this.miedo = false;
        ImageIcon vgii = new ImageIcon(this.getClass().getResource(vulnerableGhostPath));
        this.vulnerableGhostImage = vgii.getImage();
    }

    /**
     * Avanza por el mapa si buscar a pacman.
     * @param map 
     */
    public void avanza(Mapa map) {
        if (!colision(map, this.x + 1, this.y)) {
            this.x++; 
        } else if (!colision(map, this.x - 1, this.y)) {
            this.x--; 
        } else if (!colision(map, this.x, this.y + 1)) {
            this.y++; 
        } else if (!colision(map, this.x, this.y - 1)) {
            this.y--; 
        }
    }

    /**
     * Busca colisionar con pacman, intentará primero acercarse horizontalmente
     * y luego verticalmente.
     */
    public void avanza(Mapa map, int x, int y) {
           
        
        //Si pacman está a la derecha de blinky => avanza hacia la derecha
        if (x - this.x > 0 && !this.colisionDerecha && !this.colision) {
            if (!colision(map, this.x + 1, this.y) ){
                this.x++; 
            } else {
                colisionDerecha = true;  
            }
         //en caso contrario = hacia la derecha
        } else if (this.x-x>0 && !colisionIzquierda && !this.colision){
            if (!colision(map, this.x - 1, this.y) ){
                this.x--; 
            } else { 
                colisionIzquierda=true;
            }
            //estan en la misma linea
        } else {
            colisionIzquierda=false;
            colisionDerecha=false; 
        }  
        
        //hacia arriba
        if (this.y - y > 0 && !colisionArriba && !this.colision) {
            if (!colision(map, this.x, this.y - 1) ){
                this.y--;  
            } else {
//                colision = !colision;
                colisionArriba=true;
            }
          //Sen caso contrario => hacia abajo
        } else if (y-this.y>0 && !colisionAbajo && !this.colision){
            if (!colision(map, this.x, this.y + 1) ){
                this.y++; 
            } else { 
                colisionAbajo=true;
            }
            //estan en la misma linea
        } else {            
                colisionAbajo=false;
                colisionArriba=false;  
        }
        
        //si ha colisionado con otro fantasma, entonces ha cambiado 
        //de direccion y ya no está en colision
        if (this.colision){
            this.colision = false;
        }                
    }

    /**
     *
     * @param map
     * @return
     */
    public boolean colision(Mapa map, int x, int y) { 
        return (map.getElement(x, y) == '1');
    }
 
    /**
     * Si el fantasma tiene miedo, huye de pacman mientras este sea
     * invulnerable.
     * @param map
     * @param x
     * @param y 
     */
    public void huye(Mapa map, int x, int y) { 
//                 
          //Si pacman está a la derecha de blinky => huye hacia la izq
        if (x - this.x > 0 && !this.colisionDerecha && !this.colision) {
            if (!colision(map, this.x-1, this.y) ){
                this.x--; 
            } else {
                colisionDerecha = true;  
            }
         //en caso contrario = hacia la derecha
        } else if (this.x-x>0 && !colisionIzquierda && !this.colision){
            if (!colision(map, this.x +1, this.y) ){
                this.x++; 
            } else { 
                colisionIzquierda=true;
            }
            //estan en la misma linea
        } else {
            colisionIzquierda=false;
            colisionDerecha=false; 
        }  
        
        //hacia abajo
        if (this.y - y > 0 && !colisionArriba && !this.colision) {
            if (!colision(map, this.x, this.y + 1) ){
                this.y++;  
            } else {
//                colision = !colision;
                colisionArriba=true;
            }
          //Sen caso contrario => hacia arriba
        } else if (y-this.y>0 && !colisionAbajo && !this.colision){
            if (!colision(map, this.x, this.y - 1) ){
                this.y--; 
            } else { 
                colisionAbajo=true;
            }
            //estan en la misma linea
        } else {            
                colisionAbajo=false;
                colisionArriba=false;  
        }
        
        //si ha colisionado con otro fantasma, entonces ha cambiado 
        //de direccion y ya no está en colision
        if (this.colision){
            this.colision = false;
        }  
    }

    /**
     * Para evitar que los fantasmas entren en casa si no estan huyendo.
     *
     * @param map
     * @param x
     * @param y
     * @return
     */
    public boolean enCasa(Mapa map, int x, int y) {
        return map.getElement(x, y) == 'f' && map.getElement(x, y) == '=';
    }
    
    
     /**
     * Situa al fantasma en la posición de inicio
     */
    public void aCasa() {
        this.x = 9;
        this.y = 7;
    }
    
     /**
     * Situa al fantasma en la posición de inicio
     */
    public void aCasa(int x, int y) {
        this.x = x;
        this.y = y;
    }

    /**
     * Situa al fantasma en la casilla de salida sin miedo
     */
    public void reiniciar() {
        this.miedo = false;
        this.aCasa(9,7);
    }
    
     //getters & setters
    public boolean isMiedo() {
        return miedo;
    }

    public void setMiedo(boolean miedo) {
        this.miedo = miedo;
    }   

    public Image getVulnerableGhostImage() {
        return vulnerableGhostImage;
    }
 

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }   

    public boolean isColision() {
        return colision;
    }

    public void setColision(boolean colision) {
        this.colision = colision;
    }
    
    
     
}
